home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / ch_3.5 / bcd / thin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-09-11  |  1.4 KB  |  65 lines

  1. /*
  2.  * This program is used with permission from I. Cox.
  3.  * Please reference:
  4.  * R. A. Boie, I. Cox, Proc. IEEE 1st Int. Conf. Computer Vision,
  5.  * London, 1987, pp. 450-456.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include "edge_finder.h"
  11.  
  12. extern struct image *my_image;
  13.  
  14. unsigned char *
  15. image_thin ()
  16. {
  17.   register unsigned char *emP, *emPiy;
  18.   register int ix, nx, nxM1, nxP1;
  19.   register int iy, nlinks, npieces;
  20.   register int nyM1;
  21.  
  22.   register int b01, b12, b21, b10;
  23.   register int p1, p2, p3, p4;
  24.   register int b00, b02, b20, b22;
  25.  
  26.   nx = my_image->nx;
  27.   nxM1 = nx - 1;
  28.   nxP1 = nx + 1;
  29.   nyM1 = my_image->ny - 1;
  30.  
  31.   emPiy = &my_image->edge_map[0];
  32.   for (iy = 1; iy < nyM1; iy++) {
  33.     emPiy += nx;
  34.     for (ix = 1; ix < nxM1; ix++) {
  35.       emP = emPiy + ix;
  36.       b01 = *(emP - nx) > 0;
  37.       b12 = *(emP + 1) > 0;
  38.       b21 = *(emP + nx) > 0;
  39.       b10 = *(emP - 1) > 0;
  40.       if ((b01 + b12 + b21 + b10) > 1) {
  41.         b00 = *(emP - nxP1) > 0;
  42.         b02 = *(emP - nxM1) > 0;
  43.         b20 = *(emP + nxM1) > 0;
  44.         b22 = *(emP + nxP1) > 0;
  45.  
  46.         p1 = b00 | b01;
  47.         p2 = b02 | b12;
  48.         p3 = b22 | b21;
  49.         p4 = b20 | b10;
  50.  
  51.         nlinks = b01 & p2;
  52.         nlinks += b12 & p3;
  53.         nlinks += b21 & p4;
  54.         nlinks += b10 & p1;
  55.  
  56.         npieces = p1 + p2 + p3 + p4;
  57.  
  58.         if ((npieces - nlinks) < 2)
  59.           *emP = 0;             /*edge_map[iy*nx+ix]=0; */
  60.       }
  61.     }
  62.   }
  63.   return (my_image->edge_map);
  64. }
  65.